package cn.huaqingcheng.tool.core;

import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.Contract;

import java.util.Map;
import java.util.regex.Pattern;

/**
 * 简单模板
 */
@SuppressWarnings("unused")
@Slf4j
public class TemplateTool {

    /**
     * 参数占位符: {@code {{属性名}}} 形式, 属性名前后允许由任意数量空格
     */
    private static final Pattern PARAMETER_PLACEHOLDERS = Pattern.compile("\\{\\{\\s*?(?<name>\\S+)\\s*?}}");

    /**
     * 合并模板和参数
     *
     * @param path 当前类路径下资源
     * @param args 参数列表
     */
    @Contract(value = "null, _ -> fail; _, null -> fail; !null, !null -> new", pure = true)
    public static String mergeResource(String path, Map<String, Object> args) {
        return merge(IoTool.getResourceAsStr(path), args);
    }

    /**
     * 合并模板和参数
     *
     * @param template 模板字符串
     * @param args     参数列表
     */
    @Contract(value = "null, _ -> fail; _, null -> fail; !null, !null -> new", pure = true)
    public static String merge(String template, Map<String, Object> args) {
        return PARAMETER_PLACEHOLDERS.matcher(template)
            .replaceAll(matchResult -> {
                String name = matchResult.group(1);
                if (log.isTraceEnabled()) {
                    log.trace("捕获分组: {}", name);
                }
                return args.getOrDefault(name, StrTool.EMPTY).toString();
            });
    }

    /**
     * 合并模板和参数
     *
     * @param path 指定模块路径下的资源
     * @param cl   指定加载器
     * @param args 模板参数
     */
    @Contract(pure = true)
    public static String mergeResource(String path, ClassLoader cl, Map<String, Object> args) {
        return merge(IoTool.getResourceAsStr(path, cl), args);
    }

}
